#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#define null NULL
typedef void DLinkList;

typedef struct _tag_DLinkListNode
{
    struct _tag_DLinkListNode *next;
    struct _tag_DLinkListNode *prev;
} DLinkListNode;

typedef struct _tag_DLinkList
{
    DLinkListNode header;
    DLinkListNode *slider;
    int length;
} TDLinkList;

// DLinkList *DLinkList_Create();
// int DLinkList_Destroy(DLinkList **list);
// int DLinkList_Clear(DLinkList *list);
// int DLinkList_Length(DLinkList *list);
// int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos);
// DLinkListNode *DLinkList_Get(DLinkList *list, int pos);
// DLinkListNode *DLinkList_Delete(DLinkList *list, int pos);
// DLinkListNode *DLinkList_DeleteNode(DLinkList *list, DLinkListNode *node);
// DLinkListNode *DLinkList_Reset(DLinkList *list);
// DLinkListNode *DLinkList_Current(DLinkList *list);
// DLinkListNode *DLinkList_Next(DLinkList *list);
// DLinkListNode *DLinkList_Prev(DLinkList *list);

typedef struct _func_DLinkList
{
    DLinkList *(*create)();
    int (*destroy)(DLinkList **list);
    int (*clear)(DLinkList *list);
    int (*length)(DLinkList *list);
    int (*insert)(DLinkList *list, DLinkListNode *node, int pos);
    DLinkListNode *(*get)(DLinkList *list, int pos);
    DLinkListNode *(*delete)(DLinkList *list, int pos);
    DLinkListNode *(*deleteNode)(DLinkList *list, DLinkListNode *node);
    DLinkListNode *(*reset)(DLinkList *list);
    DLinkListNode *(*current)(DLinkList *list);
    DLinkListNode *(*next)(DLinkList *list);
    DLinkListNode *(*prev)(DLinkList *list);
} func_DLinkList;

#endif
